Skip to content

Conversation

@matulni
Copy link
Contributor

@matulni matulni commented Nov 25, 2025

This commit adapts the existing method :func: OpenGraph.isclose to the new API introduced in #358.
Additionally, it introduces a new method :func: OpenGraph.__eq__ relevant for open graphs of parametric type graphix.fundamentals.Plane or graphix.fundamentals.Axis.

@codecov
Copy link

codecov bot commented Nov 25, 2025

Codecov Report

❌ Patch coverage is 61.11111% with 7 lines in your changes missing coverage. Please review.
✅ Project coverage is 86.30%. Comparing base (8d9a477) to head (9358992).
⚠️ Report is 1 commits behind head on master.

Files with missing lines Patch % Lines
graphix/opengraph.py 36.36% 7 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master     #374      +/-   ##
==========================================
+ Coverage   86.25%   86.30%   +0.05%     
==========================================
  Files          44       44              
  Lines        6161     6162       +1     
==========================================
+ Hits         5314     5318       +4     
+ Misses        847      844       -3     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@matulni matulni changed the title Refactor of flow tools - OpenGraph comparison. Refactor of flow tools - OpenGraph.isclose Nov 25, 2025
if og_1.input_nodes != og_2.input_nodes or og_1.output_nodes != og_2.output_nodes:
return False

return set(og_1.measurements.keys()) == set(og_2.measurements.keys())
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't it redundant? If both og_1 and og_2 are well-formed, then these keys are their non-output nodes, and we already know that the two graphs have the same nodes and the same output nodes.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, in a context where we don't allow incorrect open graphs, this is redundant. However, I thought that we were moving away from this model, i.e., substituting the post_init by a check_well_formed method. Anticipating this design, I thought it might be interesting to ensure that two open graphs are equal, even if they are not correct (for debugging purposes, mainly). If you think the sacrifice in readability and efficiency is not worth, I'm ok with suppressing the check on the measured nodes.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, if the plan is to move towards allowing incorrect open graphs to be constructed and possibly checked afterwards, it makes sense to have a comparison function that even works on incorrect graphs.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi again @thierry-martinez. When writing #381 and #378 I realised that it's quite practical to assume that open graphs are well formed. I propose that we keep (at least for now) the _post_init_ design pattern for open graphs.

I think that for open graphs this is justified because open graphs are more often input directly by the user (contrary to flow objects, which result from built-in generation routines).

In 5cd51d6, I removed the redundancy in the structural comparison of (well-formed) open graphs as you suggested.

Comment on lines 452 to 456
if not nx.utils.graphs_equal(og_1.graph, og_2.graph):
return False

if og_1.input_nodes != og_2.input_nodes or og_1.output_nodes != og_2.output_nodes:
return False
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if not nx.utils.graphs_equal(og_1.graph, og_2.graph):
return False
if og_1.input_nodes != og_2.input_nodes or og_1.output_nodes != og_2.output_nodes:
return False
return (
nx.utils.graphs_equal(og_1.graph, og_2.graph)
and og_1.input_nodes == og_2.input_nodes
and og_1.output_nodes == og_2.output_nodes
)

Copy link
Collaborator

@thierry-martinez thierry-martinez left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! All the changes in this PR are included in #375, right? In that case, you can either merge this PR first and then #375, or just drop this PR and merge only #375. I would say it mainly depends on which PR receives the second approval first!

@matulni
Copy link
Contributor Author

matulni commented Dec 2, 2025

Implemented minor modification from discussion in 9358992
@mgarnier59

Copy link

@emlynsg emlynsg left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM too!

@matulni matulni merged commit cf9171a into TeamGraphix:master Dec 2, 2025
21 checks passed
emlynsg pushed a commit that referenced this pull request Dec 5, 2025
This commit adapts the existing method `graphix.opengraph.OpenGraph.isclose` to the new API introduced in #358. Additionally, it introduces the new methods `graphix.opengraph.OpenGraph.is_equal_structurally` which compares the underlying structure of two open graphs, and `graphix.fundamentals.AbstractMeasurement.isclose` which defaults to `==` comparison.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants